#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char const *argv[])
{
    // 初始化1，只读，字符指针
    char *a = "Hello";
    printf("初始化1:%s\n", a);
    // 初始化2，可修改，字符数组
    char b[] = "world!";
    printf("初始化2:%s\n", b);
    b[1] = '9';
    printf("修改2:%s\n", b);

    // 初始化3，动态分配
    char *c = (char *)malloc(10 * sizeof(char));
    // 赋值
    strcpy(c, "p5r no1");
    printf("初始化3——%s\n", c);
    c[7] = '9';
    c[8] = 't';
    c[9] = '\0';
    printf("赋值3——%s\n", c);
    // 获取长度
    // c是malloc的指针
    printf("c size:%d\n", sizeof c); // 返回指针的大小,8个字节
    printf("c len:%d\n", strlen(c)); // 返回字符数
    printf("c 地址1:%d\n", &c); // c这个指针存在哪里？
    printf("c 地址2:%d\n", c); // c的值就是地址
    // b是char[]
    printf("b size:%d\n", sizeof b); // 字符数组的大小 = 字符数+'\0'
    printf("b len:%d\n", strlen(b)); // 返回字符数
    printf("b 地址:%d\n", b); // b存的值也是地址，但是因为b是数组，所以sizeof的结果会不一样
    // 遍历字符串   
    char *p = b;
    printf("遍历b:");
    while (*p!='\0')
    {
        printf("%c ", *p);
        p++;
    }
    printf("\n");
    // 连接字符串
    char *a1 = (char *)malloc(20 * sizeof(char)); 
    strcpy(a1, "Hello");
    strcat(a1, " world");
    printf("连接a和其他:%s\n", a1);
    // 其他输出
    // puts只能输出字符串，不支持格式化，性能高
    printf("puts输出:");
    puts(a1);
    // putchar输出字符，对于getchar()
    printf("putchar输出:");
    putchar(*a1);
    puts("");
    printf("顺便getc输入是可以从任何输入流读取字符，这里不演示。\n");
    printf("顺便getchar()输入:");
    int d = getchar(); // 注意建议使用int来接受返回值
    printf("我们输入了:%c\n", d);
    // fputs输出，puts的功能+指定输出地点{1.标准输出(屏幕) 2.文件}
    printf("fputs输出:");
    fputs(a, stdout);
    FILE *fp = fopen("../src/file_op/string.txt", "w");
    fputs(a, fp);
    
    // 释放内存
    free(c);
    free(a1);
}
